#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*necessario para strcmp()*/
#include <strings.h>

void insereListaEstado();

/* estrutura para maquina de Mealy*/
typedef struct NoMealy {
    int estadoAtual; /* estado atual*/
    struct NoSublista *sub; /* ponteiro para sublista*/
    struct NoMealy *prox; /* ponteiro para o proximo elemento da lista */

} NoMealy, *Mealy;

/* inicializando lista de todas os elementos do tipo NoMealy*/
Mealy listaMealy = NULL;

/*estrutura para sublista*/
typedef struct NoSublista {
    char lido; /* caracter lido */
    int proxEstado; /* o estado de chegada da transicao*/
    char saida; /* a saida gerada por essa transicao*/
    struct NoSublista *prox; /* ponteiro pra proximo elemento da sublista*/

} NoSublista, *Sublista;

/* inicializando lista de todos os elementos do tipo Sublista*/
Sublista listaSublista = NULL;

/* cria elementos da lista*/
Mealy criaEstado(int estadoAtual) {
    NoMealy *novo;

    /*alocacao para insercao de novo elemento*/
    if (!(novo = (NoMealy *) malloc(sizeof (NoMealy)))) {
        printf("\nnao conseguiu alocar memoria\n");
    }
    novo->estadoAtual = estadoAtual;
    /* prevencao de merda com ponteiros */
    novo->prox = NULL;
    novo->sub = NULL;

   
    insereListaEstado(novo, novo->estadoAtual);
    //insereSublista();


    /* retorna o elemento criado*/
    return novo;
}

/*funcao cria elementos da sublista*/
Sublista criaSubLista(char lido, int estadoDestino, char saida) {
    NoSublista *novo;

    /*alocacao para insercao de novo elemento*/
    if (!(novo = (NoSublista *) malloc(sizeof (NoSublista)))) {
        printf("\nnao conseguiu alocar memoria\n");
    }

    /* inserindo dados na estrutura*/
    novo->lido = lido;
    novo->proxEstado = estadoDestino;
    novo->saida = saida;
    novo->prox = NULL;

    /* retorna o elemento criado*/
    return novo;
}

/* funcao para inserir elemento do tipo NoMealy em uma lista */
void insereListaEstado(NoMealy *novo, int estadoAtual) {
    NoMealy *element;

    if (listaMealy == NULL) {/* primeiro elemento*/
        listaMealy = novo;
    } else {
        element = listaMealy;
        if (!element->estadoAtual == estadoAtual) {
            for (element = listaMealy; (element); element = element->prox) {
                if (element->prox == NULL) {
                    element->prox = novo;
                }
            }
        } else {
            printf("ja existe o estado, nao foi possivel adicionar na lista");
        }
    }
    novo->prox = NULL;
    //return novo;
}

/* funcao pra inserir elemento do tipo sublista em uma lista*/
void insereSublista(NoMealy *novo, NoSublista *sublista) {
    NoSublista *elem;

    if (novo->sub == NULL) {
        /* lista de eleme do tipo  sublista recebe o endereco da caixinha sublista criada*/
        listaSublista = sublista;
        /* ponteiro da lista de estados aponta para a caixinha sublista criada*/
        novo->sub = sublista;
    } else {
        /* Unico elemento*/
        if (novo->sub->prox == NULL) {
            novo->sub->prox = sublista;
        } else {/* mais de um elemento*/
            for (elem = novo->sub; (elem); elem = elem->prox) {
                if (elem->prox == NULL) {
                    elem->prox = sublista;
                }
            }

        }
    }
    /* Ponteiro do ultimo elemento da lista*/
    sublista->prox = NULL;
}

int main() {
    
    /*LEITURA AINDA NAO FUNCIONANDO*/
    
    char alfabeto, saida;
    int estado1, estado2;

    do {
        printf("digite uma entrada\n");
        scanf(" %d", &estado1);
        if (estado1 != '#' || estado1 != 35) {
            scanf(" %c", &alfabeto);
            scanf(" %d", &estado2);
            scanf(" %c", &saida);
        }

    } while (estado1 != '#');
    
    EXIT_SUCCESS;
}